#!/usr/bin/evn python
# coding=utf-8
# + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +
#        ┏┓　　　┏┓+ +
# 　　　┏┛┻━━━┛┻┓ + +
# 　　　┃　　　　　　 ┃ 　
# 　　　┃　　　━　　　┃ ++ + + +
# 　　 ████━████ ┃+
# 　　　┃　　　　　　 ┃ +
# 　　　┃　　　┻　　　┃
# 　　　┃　　　　　　 ┃ + +
# 　　　┗━┓　　　┏━┛
# 　　　　　┃　　　┃　　　　　　　　　　　
# 　　　　　┃　　　┃ + + + +
# 　　　　　┃　　　┃　　　　Codes are far away from bugs with the animal protecting　　　
# 　　　　　┃　　　┃ + 　　　　神兽保佑,代码无bug　　
# 　　　　　┃　　　┃
# 　　　　　┃　　　┃　　+　　　　　　　　　
# 　　　　　┃　 　　┗━━━┓ + +
# 　　　　　┃ 　　　　　　　┣┓
# 　　　　　┃ 　　　　　　　┏┛
# 　　　　　┗┓┓┏━┳┓┏┛ + + + +
# 　　　　　　┃┫┫　┃┫┫
# 　　　　　　┗┻┛　┗┻┛+ + + +
# + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +"""
"""
Author = zyx
@Create_Time: 2021/10/6 21:46
@version: v1.0.0
@Contact: 308711822@qq.com
@File: __init__.py.py
@文件功能描述:------
"""
from contextlib import contextmanager

from fastapi import FastAPI
from playhouse.pool import PooledPostgresqlExtDatabase

from afast_core.core_tools.singleton_helper import Singleton


class PeeweeSyncPooledPostgresqlClient:

    def init_sync_pooled_postgresql(self, pgconf_setting):
        self.database = PooledPostgresqlExtDatabase(
            pgconf_setting.db_name,
            max_connections=pgconf_setting.max_connections,
            stale_timeout=pgconf_setting.stale_timeout,  # 5 minutes.
            timeout=pgconf_setting.timeout,
            **{'user': pgconf_setting.DB_USER, 'host': pgconf_setting.db_host,
               'password': pgconf_setting.db_pass,
               'port': pgconf_setting.db_port})
        return self.database

    def GetSession(self):
        return self.database

    def GetSessionAtomic(self):
        return self.database.atomic()

    def session_scope_atomic(self):
        return self.GetSessionAtomic()

    @contextmanager
    def session_scope(self):
        session = self.GetSession()
        if session.is_closed():
            # session.connection_context()
            session.connect()
        try:
            yield session
            session.commit()
        except:
            session.rollback()
            raise
        finally:
            session.close()

    def session_scope2(self):
        session = self.GetSession()
        with session.manual_commit():
            session.begin()  # Begin transaction explicitly.
            try:
                yield session
            except:
                session.rollback()  # Rollback -- an error occurred.
                raise
            else:
                try:
                    session.commit()  # Attempt to commit changes.
                except:
                    session.rollback()  # Error committing, rollback.
                    raise
            finally:
                session.close()
